package com.pubinfo.passbook.common.model.dubbo;

import com.alibaba.fastjson.JSONObject;
import com.pubinfo.passbook.common.utils.MD5;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author zhouch
 * @date 2021/11/18 17:00
 */
@Data
@ApiModel
@NoArgsConstructor
public class ESBServiceData {
  
  /**
   * 人力接口
   * 入参对象
   */
  @Data
  @NoArgsConstructor
  public static class In {
    /**
     * 请求系统编码,具体参考附录
     */
    public String sysId;
    
    /**
     * 用来标识用户的唯一ID，可为空
     */
    public String userId;
    
    /**
     * 服务名称
     */
    public String service;
    
    /**
     * 数字签名
     */
    public String signature;
    
    /**
     * 8位随机数
     */
    public String randomNum;
    
    /**
     * 时间戳
     */
    public String timestamp;
    
    /**
     * 客户端系统业务流水号，可为空
     */
    public String bizId;
    
    /**
     * 身份集合
     */
    public Collection<Cert> certs;
    
    /**
     * 创建一个入参实例
     *
     * @return
     */
    public static In makeInstance(Collection<Cert> certs, String sign, String sysId, String service) {
      In that = new In();
      that.setTimestamp(String.valueOf(System.currentTimeMillis()));
      
      that.setSysId(sysId);
      that.setService(service);
      
      // 随机8位数
      that.setRandomNum(String.valueOf(new Random().nextLong()).substring(1, 9));
      
      // 数字签名S1=MD5(时间戳+8位随机数+约定的密钥) 小写。
      that.setSignature(MD5.digest(that.getTimestamp() + that.getRandomNum() + sign).toLowerCase());
      
      that.setCerts(certs);
      
      return that;
    }
    
    public String toJson() {
      
      /**
       * 最终生成示例
       {
       "base": {
       "sysId": "51",//请求系统编码,具体参考附录
       "userId": "100000013324",//用来标识用户的唯一ID，可为空
       "service": "staffBaseInfoQueryForSSCService", //服务名称
       "signature": "e2398beef8493fdd88e43fab4ecd87",//数字签名
       "randomNum": "13579046",//8位随机数
       "timestamp": "1431067080349",//时间戳
       "bizId": "250000234534"//客户端系统业务流水号，可为空
       },
       "param": [{
       "idCard": "11111111111111111111111"//身份证号
       "staffName": "11111111111111111111111"//姓名
       }
       ]
       }
       */
      
      JSONObject json = new JSONObject();
      
      JSONObject base = new JSONObject();
      
      base.put("sysId", getSysId());
      base.put("userId", getUserId());
      base.put("service", getService());
      base.put("signature", getSignature());
      base.put("randomNum", getRandomNum());
      base.put("timestamp", getTimestamp());
      base.put("bizId", getBizId());
      
      Object param = JSONObject.toJSON(getCerts());
      
      json.put("base", base);
      json.put("param", param);
      
      return json.toJSONString();
    }
    
    
  }
  
  /**
   * 出参对象
   */
  @Data
  @NoArgsConstructor
  public static class Out {
    
    /**
     * "base": {
     * "resCode": "0000", //结果编码，具体参考附录6
     * "resMsg": "处理成功", //处理：结果描述信息
     * "transId": "" //服务端系统业务处理流水号
     * },
     */
    public Map<String, String> base;
    
    /**
     * 详细身份合集
     */
    public Collection<CertDetail> data;
    
    public String getResCode() {
      return base.getOrDefault("resCode", "");
    }
    
    public String getResMsg() {
      return base.getOrDefault("resMsg", "");
    }
    
    public String getTransId() {
      return base.getOrDefault("transId", "");
    }
    
  }
  
  /**
   * 身份信息
   */
  @Data
  @ApiModel
  @AllArgsConstructor
  public static class Cert {
    /**
     * 身份证号码
     */
    @ApiModelProperty("身份证号码或者是人员账号")
    public String idCard;
  
    /**
     * 姓名
     */
    @ApiModelProperty("人员姓名")
    public String staffName;
  
    public Cert(String idCard) {
      this.idCard = idCard;
      this.staffName = "";
    }
  
    public Cert() {
    
    }
  }
  
  /**
   * 身份信息 （返回）
   */
  @Data
  @NoArgsConstructor
  public static class CertDetail {
    
    /**
     * 姓名
     */
    public String staffName;
    
    /**
     * 人员编码
     */
    public String staffCode;
    
    /**
     * 手机号
     */
    public String staffPhone;
    
    /**
     * 地市
     */
    public String areaName;
    
    /**
     * 区县
     */
    public String countyName;
    
    /**
     * 部门
     */
    public String deptName;
    
    /**
     * 岗级
     */
    public String postLevel;
    
    /**
     * 用工性质：合同、外包、代理
     */
    public String natureName;
    
    /**
     * 人员状态：在职、离休、退休、内退
     */
    public String staffStatus;
    
    /**
     * 工龄
     */
    public String workTime;
    
    /**
     * 电信工龄
     */
    public String workTimeTele;
    
    /*
    生日日期
     */
    public String birthDate;
    
    @SneakyThrows
    public Integer getAge() {
      if (StringUtils.isNotBlank(this.birthDate)) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse(birthDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        Calendar cal2 = Calendar.getInstance();
        return cal2.get(Calendar.YEAR) - cal.get(Calendar.YEAR);
      }
      
      return 0;
    }
    
    public String getSubsidiaryName() {
      String areaName = this.getAreaName();
      if (StringUtils.isNotBlank(areaName)) {
  
        if (areaName.indexOf("(") > 0) {
          //过滤部门信息
          areaName = areaName.substring(0, areaName.indexOf("("));
        }
        if (areaName.indexOf("（") > 0) {
          //过滤部门信息
          areaName = areaName.substring(0, areaName.indexOf("（"));
        }
      }
      return areaName;
    }
  }
  
}
